package com.ghxxzx.dagl.utils;

import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Author: 刘华
 * @Date: 2020/12/9 9:13
 * @Version 1.0
 */
public class FileUtils {
    private static String target = null;
    private static String sourseRoot = null;

    /**
     * 删除单个文件
     *
     * @param fileName
     *            要删除的文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                return true;
            } else {
                System.out.println("删除单个文件" + fileName + "失败！");
                return false;
            }
        } else {
            System.out.println("删除单个文件失败：" + fileName + "不存在！");
            return false;
        }
    }

    /**
     * 删除目录及目录下的文件
     *
     * @param dir
     *            要删除的目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    public static boolean deleteDirectory(String dir) {
        // 如果dir不以文件分隔符结尾，自动添加文件分隔符
        if (!dir.endsWith(File.separator))
            dir = dir + File.separator;
        File dirFile = new File(dir);
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
            System.out.println("删除目录失败：" + dir + "不存在！");
            return false;
        }
        boolean flag = true;
        // 删除文件夹中的所有文件包括子目录
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = FileUtils.deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
            // 删除子目录
            else if (files[i].isDirectory()) {
                flag = FileUtils.deleteDirectory(files[i]
                        .getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag) {
            System.out.println("删除目录失败！");
            return false;
        }
        // 删除当前目录
        if (dirFile.delete()) {
            System.out.println("删除目录" + dir + "成功！");
            return true;
        } else {
            return false;
        }
    }

//    public static void copyFile(String targetPath, String path) {
//        File file = new File(path);
//        FileInputStream inputStream = null;
//        FileOutputStream outputStream = null;
////        File tempFile = null;
//        try {
//            if (file.exists()) {
////                String suffix = path.substring(path.lastIndexOf(".") + 1);
////                String prefix = file.getName().substring(0, file.getName().lastIndexOf("."));
////                String name = prefix + "." + suffix;
////                outputStream = new FileOutputStream(tempFile);
//                inputStream = new FileInputStream(file);
//                outputStream = new FileOutputStream(targetPath + "\\" + file.getName());
//                FileCopyUtils.copy(inputStream, outputStream);
//            }
//        } catch (JyException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            if (outputStream != null) {
//                try {
//                    outputStream.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//            if (inputStream != null) {
//                try {
//                    inputStream.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
////            if (tempFile != null) {
////                tempFile.delete();
////            }
//        }
//    }

    public static void copyFile(String sourse, String target1) {
        File file = new File(target1);
        if (file.exists()) {
            FileUtils.deleteDirectory(target1);
        }
        target = target1;
        sourseRoot = sourse;
        createflies(target);
        clone(sourse);
    }
    public static void copyFile2(String sourse, String target1) {
        File file = new File(target1);
        if (file.exists()) {
            FileUtils.deleteDirectory(target1);
        }
        target = target1;
        sourseRoot = sourse;
        clone(sourse);
    }

    public static void clone(String sourse) {
        //获取目录下所有文件
        File f = new File(sourse);
        if (f.isDirectory()){
            File[] allf = f.listFiles();
            //遍历所有文件
            for (File fi : allf) {
                try {
                    //拼接目标位置
                    String URL = target + fi.getAbsolutePath().substring(sourseRoot.length());

                    //创建目录或文件
                    if (fi.isDirectory()) {
                        createflies(URL);
                    } else {
                        fileInputOutput(fi.getAbsolutePath(), URL);
                    }

                    //递归调用
                    if (fi.isDirectory()) {
                        clone(fi.getAbsolutePath());
                    }

                } catch (Exception e) {
                    System.out.println("error");
                }
            }
        }else {
            try {
                //拼接目标位置
                String URL = target + f.getAbsolutePath().substring(sourseRoot.length());

                //创建目录或文件
                if (f.isDirectory()) {
                    createflies(URL);
                } else {
                    fileInputOutput(f.getAbsolutePath(), URL);
                }

                //递归调用
                if (f.isDirectory()) {
                    clone(f.getAbsolutePath());
                }

            } catch (Exception e) {
//                System.out.println("error");
                fileInputOutput(f.getAbsolutePath(), target);
            }
        }

    }

    /**
     * 复制文件
     *
     * @param sourse
     * @param target
     */
    public static void fileInputOutput(String sourse, String target) {
        FileInputStream fin = null;
        FileOutputStream fout = null;
        try {
            File s = new File(sourse);
            File t = new File(target);

            fin = new FileInputStream(s);
            fout = new FileOutputStream(t);
            IOUtils.copy(fin,fout);
//            byte[] a = new byte[1024 * 1024 * 4];
//            int b = -1;
//
//            //边读边写
//            while ((b = fin.read(a)) != -1) {
//                fout.write(a, 0, b);
//            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fout!=null){
                try {
                    fout.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fin!=null){
                try {
                    fin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }


        }

    }

    /**
     * 创建目录
     *
     * @param name
     * @return
     */
    public static boolean createflies(String name) {
        boolean flag = false;
        File file = new File(name);
        //创建目录
        if (file.mkdir() == true) {
            System.out.println("文件夹创建成功！");
            flag = true;
        } else {
            System.out.println("文件夹创建失败！");
            flag = false;

        }

        return flag;
    }
}
